package Traductor.lexico.estados;

import java.util.HashMap;

import Traductor.lexico.utils.Token;
import Traductor.lexico.utils.Token.TipoToken;

/**
 * Estado de aceptacion en el que se devuelve un token antes de regresar al estado inicial.
 * Implementa la interfaz Estado.
 */
public class EstadoAceptacionSimboloCompuesto implements Estado {
	private HashMap<String, Token.TipoToken> h = new HashMap<String, TipoToken>();
	private int id;
	private boolean inicial;	
	private boolean retrocede;
	private int siguienteEstado;
	
	/**
	 * Constructora de la clase EstadoAceptacionSimboloCompuesto
	 * @param id La id del estado
	 * @param retrocede Un booleano que indica si hay retroceso o no
	 */
	public EstadoAceptacionSimboloCompuesto(int id, boolean retrocede){
		this.retrocede = retrocede;
		this.id=id;
		this.inicial = false;
		h.put("<<", TipoToken.dizq);
		h.put(">>", TipoToken.dder);
		h.put("<=", TipoToken.menorigual);
		h.put(">=", TipoToken.mayorigual);
		h.put("!=", TipoToken.distinto);
		//h.put(":=", TipoToken.asig);
		h.put("==", TipoToken.igual);
		h.put("->", TipoToken.flecha);
	}
	/**
	 * Getter de "id"
	 * @return id
	 */
	@Override
	public int getId(){
		return id;
	}

	/** Devuelve el token correspondiente con el lexema apropiado
	 * @param lexema El lexema que contiene el token
	 * @return El token modificado apropiadamente
	 */
	@Override
	public Token getToken(String lexema){
		String lex = lexema;
		if(retrocede || lexema.charAt(lexema.length()-1)==0)
			lex = lexema.substring(0,lexema.length()-1);
		if(h.get(lex)!= null)
			return new Token(h.get(lex),lex);
		return new Token(TipoToken.ERROR,lex);
	}

	/**Getter de "siguienteEstado"
	 * @return siguienteEstado
	 */
	@Override
	public int getSiguienteEstado(){
		return siguienteEstado;
	}

	/** Devuelve -1 p 0 dependiendo de "retrocede"
	 * @param siguiente No se usa para nada
	 * @return -1 o 0 en funcion de "retrocede"
	 */
	@Override
	public int transita(char siguiente) throws Exception{
		if(retrocede)
			 return -1;
		 else 
			 return 0;
	}

	/** Getter de "inicial"
	 * @return inicial 
	 */
	@Override
	public boolean estadoInicial(){
		return inicial;
	}

}
